package com.qf.servlet;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;

/**
 * CodeServletA（code） - tomcat帮我们初始化
 *
 * static -> 全局只有一份 （类成员 不是对象成员）
 *
 * 生成验证码的Servlet
 * description:
 * author: Ken
 * 公众号：Java架构栈
 *
 */
@WebServlet(urlPatterns = "/code")
public class CodeServlet extends HttpServlet {

    /**
     *  A浏览器
     *  B浏览器
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //生成验证码
        //awt swing - c/s 客户端

        int width = 60;
        int height = 40;

        //创建一个BufferImage对象
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        //获得图片的一个图层对象，在图层对象上绘制内容
        Graphics graphics = image.getGraphics();
        //设置颜色
        graphics.setColor(Color.green);
        //绘制矩形
        graphics.fillRect(0, 0, width, height);

        //绘制内容
        //生成验证码
        String code = createCode();

        //使用Session将生成的验证码保存起来
        req.getSession().setAttribute("code", code);
        //存储当前验证码的生成时间 - ms
        req.getSession().setAttribute("code_create_time", System.currentTimeMillis());


        //设置颜色
        graphics.setColor(Color.red);
        //设置文字的样式
        graphics.setFont(new Font("微软雅黑", Font.BOLD, 20));
        graphics.drawString(code, (int)(width*0.1), (int)(height*0.7));

        //绘制10条干扰线
        //Math.random() -> [0->1)
        graphics.setColor(Color.BLUE);
        for (int i = 0; i < 10; i++) {
            graphics.drawLine((int)(Math.random()*width), (int)(Math.random()*height), (int)(Math.random()*width), (int)(Math.random()*height));
        }

        //将图片输出给页面的Img标签
        ImageIO.write(image, "jpg", resp.getOutputStream());
    }

    /**
     * 生成验证码
     * @return
     */
    private String createCode(){
        //A-Z a-z 0-9 ?
        //1000~9999 [0~1) [1000~10000)
        return (int)(Math.random() * 9000 + 1000) + "";
    }
}
